﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace Infrastructure.Model.ApiResult
{
    public class ApiResult
    {
        // 响应码，通常用于表示操作的结果状态
        public int Code { get; set; }

        // 响应消息，通常用于描述操作结果的简要信息
        public string Msg { get; set; }

        // 返回的数据，可能是任何类型，默认值为 null，且在序列化时，如果为 null，则忽略该属性
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public object Data { get; set; }

        // 计算属性，判断请求是否成功，Code 为 200 时表示成功
        [Newtonsoft.Json.JsonIgnore]
        public bool IsSuccess => Code == 200;

        // 默认构造函数
        public ApiResult()
        {
        }

        // 带 Code 和 Msg 的构造函数
        public ApiResult(int code, string msg)
        {
            Code = code;
            Msg = msg;
        }

        // 带 Code、Msg 和 Data 的构造函数
        public ApiResult(int code, string msg, object data)
        {
            Code = code;
            Msg = msg;
            if (data != null)
            {
                Data = data;
            }
        }

        // 设置为成功状态，Code 为 200，Msg 为 "success"
        public ApiResult Success()
        {
            Code = 200;
            Msg = "success";
            return this;
        }

        // 重写 ToString 方法，将 ApiResult 对象转为 JSON 字符串
        public override string ToString()
        {
            return JsonConvert.SerializeObject(this);
        }

        // 静态方法，返回一个成功的 ApiResult，带有数据
        public static ApiResult Success(object data)
        {
            return new ApiResult(HttpStatus.SUCCESS, "success", data);
        }

        // 静态方法，返回一个成功的 ApiResult，只有消息
        public static ApiResult Success(string msg)
        {
            return new ApiResult(HttpStatus.SUCCESS, msg, null);
        }

        // 静态方法，返回一个成功的 ApiResult，带有消息和数据
        public static ApiResult Success(string msg, object data)
        {
            return new ApiResult(HttpStatus.SUCCESS, msg, data);
        }

        // 设置为 401 状态，表示权限不足或访问被拒绝
        public ApiResult On401()
        {
            Code = 401;
            Msg = "access denied";
            return this;
        }

        // 设置错误响应，带有 ResultCode 和消息
        public ApiResult Error(ResultCode resultCode, string msg = "")
        {
            Code = (int)resultCode;
            Msg = msg;
            return this;
        }

        // 静态方法，返回一个指定错误代码和消息的 ApiResult
        public static ApiResult Error(int code, string msg)
        {
            return new ApiResult(code, msg);
        }

        // 静态方法，返回一个 400 错误代码和指定消息的 ApiResult
        public static ApiResult Error(string msg)
        {
            return new ApiResult(400, msg);
        }
    }
    public class ApiResult<T> : ApiResult where T : class
    {
        public T Item { get; set; }

        public ApiResult(int code, string msg, T item)
            : base(code, msg, item)
        {
            Item = item;
        }

        public static ApiResult<T> Success(T item)
        {
            return new ApiResult<T>(HttpStatus.SUCCESS, "", item);
        }

        public static ApiResult<T> Success(string msg, T item)
        {
            return new ApiResult<T>(HttpStatus.SUCCESS, msg, item);
        }

        public new static ApiResult<T> Error(string msg)
        {
            return new ApiResult<T>(HttpStatus.BAD_REQUEST, msg, null);
        }
    }
}
